Ejercicio 1:

Realice un programa que permita el entrenamiento y prueba de un perceptrón simple con una cantidad variable de entradas.

Resolución del problema OR

  • Lectura de los patrones de entrenamiento
OR_trn <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/OR_trn.csv", col_names = FALSE)
OR_tst <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/OR_tst.csv", col_names = FALSE)
  • Selección de parámetros y entrenamiento de perceptrón

Utilizamos las funciones implementadas en el archivo “PerceptronSimple.R”

pesos <- entrenarPerceptron(OR_trn, maxEpocas = 10, critFinalizacion = 0.8)
## Epoca: 1 - Tasa: 1
# Modelo obtenido
pesos
## [1] 1 1 1

El entrenamiento nos devuelve la tasa obtenida en cada época y al final mostramos los valores de los pesos w que definen la recta del modelo.

$ pesos = [w_0, w_1, w_2, …w_n] $

  • Graficas
graficarRectaSeparacion(pesos, OR_trn)

En la gráfica vemos como la recta del modelo separa el dominio según la clase.

  • Prueba con datos de test
test <- aplicarPerceptron(pesos, OR_tst)
test$tasa
## [1] 1

Por ser este un problema sencillo donde las clases son separables por una recta, la tasa de aciertos en test nos da un 100%.

Resolución del problema XOR

  • Lectura de los patrones de entrenamiento
XOR_trn <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/XOR_trn.csv", col_names = FALSE)
XOR_tst <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/XOR_tst.csv", col_names = FALSE)
  • Selección de parámetros y entrenamiento de perceptrón
pesos <- entrenarPerceptron(XOR_trn, maxEpocas = 10, critFinalizacion = 0.8)
## Epoca: 1 - Tasa: 0.4965
## Epoca: 2 - Tasa: 0.4965
## Epoca: 3 - Tasa: 0.4965
## Epoca: 4 - Tasa: 0.4965
## Epoca: 5 - Tasa: 0.4965
## Epoca: 6 - Tasa: 0.4965
## Epoca: 7 - Tasa: 0.4965
## Epoca: 8 - Tasa: 0.4965
## Epoca: 9 - Tasa: 0.4965
## Epoca: 10 - Tasa: 0.4965
pesos
## [1] 504.50000  -2.75460  -2.85718

Vemos que luego de 10 épocas el perceptrón simple no logra resolver el problema del XOR, ni tampoco mejorar su tasa de aciertos.

  • Graficas
graficarRectaSeparacion(pesos, XOR_trn)

En la gráfica vemos la recta obtenida que deja todos los patrones clasificados de igual manera.

  • Prueba con datos de test
test <- aplicarPerceptron(pesos, XOR_tst)
test$tasa
## [1] 0.44

Este problema no pudo ser resuelto por le perceptrón simple, la tasa de aciertos obtenida es peor que el azar.

Preguntas:

  • ¿Pueden ser resueltos ambos problemas (OR y XOR) empleando un perceptrón simple? Justifique su respuesta.

En los resultados obtenidos verificamos que no se puede resolver el problema XOR con el perceptrón simple porque no es posible dividir la clase con una recta que separe el dominio en dos.

  • ¿Qué efecto tiene la tasa de aprendizaje en el entrenamiento del perceptrón? Explique cómo este parámetro afecta a la actualización de la frontera de decisión

La tasa de aprendizaje nos permite variar cuanto se actualizan los valores de los pesos. Una tasa muy baja puede generar que el algoritmo demore mucho en llegar al mínimo, y una tasa muy alta puede generar que el algoritmo diverja y nunca llegue a un mínimo. En nuestro caso, se implementó una función que posee una tasa de aprendizaje de 0,05 (nu=0.05) por defecto y no fue necesario cambiarlo.

Ejercicio 2:

Punto a:

  • Lectura de datos
spheres1d10 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres1d10.csv", col_names = FALSE)
#Nombre de las columnas
colnames(spheres1d10)
## [1] "X1" "X2" "X3" "X4"
#Dimenciones de los datos
dim(spheres1d10)
## [1] 1000    4
  • Grafica
plot_ly(x=spheres1d10$X1, y=spheres1d10$X2, z=spheres1d10$X3, type="scatter3d", 
        mode="markers", color=spheres1d10$X4)
  • Generamos las particiones

Utilizamos la función implementada en el archivo “Particiones.R”

particion_spheres1d10 <- generarNParticionesPorID(dataset = spheres1d10, nroParticiones = 5, 
                                                porcEntrenamiento = 0.8, semilla = 1, 
                                                clase = "X4")

Esta función nos devuelve un listado de 5 listas de ID para entrenamiento, de aproximadamente 800 elementos, y 5 listas de ID para prueba, de aproximadamente 200 elementos.

  • Generamos los modelos con el perceptrón simple.
for (n in seq(1,5)) {
  print(glue::glue("Partición: {n}"))
  #Entrenamiento
  pesos <- entrenarPerceptron(spheres1d10[particion_spheres1d10$trn[[n]],], 
                                   maxEpocas = 10, critFinalizacion = 0.8)
  print(glue::glue("Pesos: {pesos}"))
  #Prueba
  test <- aplicarPerceptron(pesos, spheres1d10[particion_spheres1d10$tst[[n]],])
  print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
}
## Partición: 1
## Epoca: 1 - Tasa: 0.53125
## Epoca: 2 - Tasa: 0.53125
## Epoca: 3 - Tasa: 0.53125
## Epoca: 4 - Tasa: 0.53125
## Epoca: 5 - Tasa: 0.53125
## Epoca: 6 - Tasa: 0.53125
## Epoca: 7 - Tasa: 0.53125
## Epoca: 8 - Tasa: 0.53125
## Epoca: 9 - Tasa: 0.53125
## Epoca: 10 - Tasa: 0.53125
## Pesos: 187.850000000008
## Pesos: -109.2078535
## Pesos: -0.170800000000001
## Pesos: -16.9217549999999
## Tasa de aciertos en test: 0.53
## Partición: 2
## Epoca: 1 - Tasa: 0.53125
## Epoca: 2 - Tasa: 0.53125
## Epoca: 3 - Tasa: 0.53125
## Epoca: 4 - Tasa: 0.53125
## Epoca: 5 - Tasa: 0.53125
## Epoca: 6 - Tasa: 0.53125
## Epoca: 7 - Tasa: 0.53125
## Epoca: 8 - Tasa: 0.53125
## Epoca: 9 - Tasa: 0.53125
## Epoca: 10 - Tasa: 0.53125
## Pesos: 187.650000000008
## Pesos: -112.205494
## Pesos: 5.63569049999998
## Pesos: -15.1915654999999
## Tasa de aciertos en test: 0.53
## Partición: 3
## Epoca: 1 - Tasa: 0.53125
## Epoca: 2 - Tasa: 0.53125
## Epoca: 3 - Tasa: 0.53125
## Epoca: 4 - Tasa: 0.53125
## Epoca: 5 - Tasa: 0.53125
## Epoca: 6 - Tasa: 0.53125
## Epoca: 7 - Tasa: 0.53125
## Epoca: 8 - Tasa: 0.53125
## Epoca: 9 - Tasa: 0.53125
## Epoca: 10 - Tasa: 0.53125
## Pesos: 187.700000000008
## Pesos: -112.365995
## Pesos: 11.2066119999999
## Pesos: -9.74150049999998
## Tasa de aciertos en test: 0.53
## Partición: 4
## Epoca: 1 - Tasa: 0.530586766541823
## Epoca: 2 - Tasa: 0.530586766541823
## Epoca: 3 - Tasa: 0.530586766541823
## Epoca: 4 - Tasa: 0.530586766541823
## Epoca: 5 - Tasa: 0.530586766541823
## Epoca: 6 - Tasa: 0.530586766541823
## Epoca: 7 - Tasa: 0.530586766541823
## Epoca: 8 - Tasa: 0.530586766541823
## Epoca: 9 - Tasa: 0.530586766541823
## Epoca: 10 - Tasa: 0.530586766541823
## Pesos: 188.450000000009
## Pesos: -105.3191515
## Pesos: 3.28833400000001
## Pesos: -11.9641719999999
## Tasa de aciertos en test: 0.532663316582915
## Partición: 5
## Epoca: 1 - Tasa: 0.530663329161452
## Epoca: 2 - Tasa: 0.530663329161452
## Epoca: 3 - Tasa: 0.530663329161452
## Epoca: 4 - Tasa: 0.530663329161452
## Epoca: 5 - Tasa: 0.530663329161452
## Epoca: 6 - Tasa: 0.530663329161452
## Epoca: 7 - Tasa: 0.530663329161452
## Epoca: 8 - Tasa: 0.530663329161452
## Epoca: 9 - Tasa: 0.530663329161452
## Epoca: 10 - Tasa: 0.530663329161452
## Pesos: 187.850000000008
## Pesos: -109.286727
## Pesos: -1.4164115
## Pesos: -12.592915
## Tasa de aciertos en test: 0.532338308457711

Punto b:

  • Lectura de datos
spheres2d10 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres2d10.csv", col_names = FALSE)
spheres2d50 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres2d50.csv", col_names = FALSE)
spheres2d70 <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/spheres2d70.csv", col_names = FALSE)
  • Generamos las particiones

Llamamos a la función dos veces con dos semillas para obtener las 10 particiones. La función implementada genera las particiones sin reemplazo, con una relación 80/20 no se pueden generar más de 5 particiones.

# 10%
particion_spheres2d10 <- generarNParticionesPorID(dataset = spheres2d10, nroParticiones = 5, 
                                                porcEntrenamiento = 0.8, semilla = 1, 
                                                clase = "X4")
particion_spheres2d10$trn <- c(particion_spheres2d10$trn, generarNParticionesPorID(
  dataset = spheres2d10, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12, 
  clase = "X4")$trn)
particion_spheres2d10$tst <- c(particion_spheres2d10$tst, generarNParticionesPorID(
  dataset = spheres2d10, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12, 
  clase = "X4")$tst)

# 50%
particion_spheres2d50 <- generarNParticionesPorID(dataset = spheres2d50, nroParticiones = 5, 
                                                porcEntrenamiento = 0.8, semilla = 1, 
                                                clase = "X4")
particion_spheres2d50$trn <- c(particion_spheres2d50$trn, generarNParticionesPorID(
  dataset = spheres2d50, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12, 
  clase = "X4")$trn)
particion_spheres2d50$tst <- c(particion_spheres2d50$tst, generarNParticionesPorID(
  dataset = spheres2d50, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12, 
  clase = "X4")$tst)

# 70%
particion_spheres2d70 <- generarNParticionesPorID(dataset = spheres2d70, nroParticiones = 5, 
                                                porcEntrenamiento = 0.8, semilla = 1, 
                                                clase = "X4")
particion_spheres2d70$trn <- c(particion_spheres2d70$trn, generarNParticionesPorID(
  dataset = spheres2d70, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12, 
  clase = "X4")$trn)
particion_spheres2d70$tst <- c(particion_spheres2d70$tst, generarNParticionesPorID(
  dataset = spheres2d70, nroParticiones = 5, porcEntrenamiento = 0.8, semilla = 12, 
  clase = "X4")$tst)
  • Generamos los modelos con el perceptrón simple.

– Datos con desviaciones del 10%

plot_ly(x=spheres2d10$X1, y=spheres2d10$X2, z=spheres2d10$X3, type="scatter3d", 
        mode="markers", color=spheres2d10$X4)
tasaMedia <- 0
for (n in seq(1,10)) {
  print(glue::glue("Partición: {n}"))
  #Entrenamiento
  pesos <- entrenarPerceptron(spheres2d10[particion_spheres2d10$trn[[n]],], 
                                   maxEpocas = 5, critFinalizacion = 0.79)
  print(glue::glue("Pesos: {pesos}"))
  #Pruba
  test <- aplicarPerceptron(pesos, spheres2d10[particion_spheres2d10$tst[[n]],])
  print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
  tasaMedia <- tasaMedia + test$tasa
}
## Partición: 1
## Epoca: 1 - Tasa: 0.76525
## Epoca: 2 - Tasa: 0.78
## Epoca: 3 - Tasa: 0.783
## Epoca: 4 - Tasa: 0.7855
## Epoca: 5 - Tasa: 0.7865
## Pesos: 224.750000000017
## Pesos: -221.062984499999
## Pesos: 7.253625
## Pesos: -7.78130499999998
## Tasa de aciertos en test: 0.799
## Partición: 2
## Epoca: 1 - Tasa: 0.7725
## Epoca: 2 - Tasa: 0.78425
## Epoca: 3 - Tasa: 0.78875
## Epoca: 4 - Tasa: 0.79075
## Pesos: 177.500000000006
## Pesos: -174.5293535
## Pesos: 5.64960150000001
## Pesos: -6.04182649999999
## Tasa de aciertos en test: 0.778
## Partición: 3
## Epoca: 1 - Tasa: 0.7755
## Epoca: 2 - Tasa: 0.7845
## Epoca: 3 - Tasa: 0.7885
## Epoca: 4 - Tasa: 0.7885
## Epoca: 5 - Tasa: 0.79075
## Pesos: 221.350000000016
## Pesos: -217.638075999999
## Pesos: 7.6643725
## Pesos: -7.18889749999998
## Tasa de aciertos en test: 0.786
## Partición: 4
## Epoca: 1 - Tasa: 0.770057485628593
## Epoca: 2 - Tasa: 0.781054736315921
## Epoca: 3 - Tasa: 0.784803799050237
## Epoca: 4 - Tasa: 0.786303424143964
## Epoca: 5 - Tasa: 0.787803049237691
## Pesos: 222.700000000016
## Pesos: -219.0483805
## Pesos: 7.40051049999999
## Pesos: -7.70832349999997
## Tasa de aciertos en test: 0.794794794794795
## Partición: 5
## Epoca: 1 - Tasa: 0.773943485871468
## Epoca: 2 - Tasa: 0.784446111527882
## Epoca: 3 - Tasa: 0.789197299324831
## Epoca: 4 - Tasa: 0.791947986996749
## Pesos: 176.000000000006
## Pesos: -173.1365555
## Pesos: 6.10863649999999
## Pesos: -5.82814349999998
## Tasa de aciertos en test: 0.787212787212787
## Partición: 6
## Epoca: 1 - Tasa: 0.77375
## Epoca: 2 - Tasa: 0.784
## Epoca: 3 - Tasa: 0.78775
## Epoca: 4 - Tasa: 0.79
## Epoca: 5 - Tasa: 0.7915
## Pesos: 219.450000000016
## Pesos: -215.843120499999
## Pesos: 6.938335
## Pesos: -7.47346399999998
## Tasa de aciertos en test: 0.777
## Partición: 7
## Epoca: 1 - Tasa: 0.76725
## Epoca: 2 - Tasa: 0.78175
## Epoca: 3 - Tasa: 0.7865
## Epoca: 4 - Tasa: 0.789
## Epoca: 5 - Tasa: 0.79175
## Pesos: 222.100000000016
## Pesos: -218.459041999999
## Pesos: 7.152588
## Pesos: -7.80188199999998
## Tasa de aciertos en test: 0.783
## Partición: 8
## Epoca: 1 - Tasa: 0.77375
## Epoca: 2 - Tasa: 0.785
## Epoca: 3 - Tasa: 0.79025
## Pesos: 135.299999999997
## Pesos: -132.7442795
## Pesos: 4.94413500000001
## Pesos: -4.45324449999999
## Tasa de aciertos en test: 0.777
## Partición: 9
## Epoca: 1 - Tasa: 0.768057985503624
## Epoca: 2 - Tasa: 0.777805548612847
## Epoca: 3 - Tasa: 0.782804298925269
## Epoca: 4 - Tasa: 0.784803799050237
## Epoca: 5 - Tasa: 0.785553611597101
## Pesos: 222.950000000016
## Pesos: -219.1872425
## Pesos: 7.38372199999999
## Pesos: -7.51598999999998
## Tasa de aciertos en test: 0.794794794794795
## Partición: 10
## Epoca: 1 - Tasa: 0.769942485621405
## Epoca: 2 - Tasa: 0.780445111277819
## Epoca: 3 - Tasa: 0.784696174043511
## Epoca: 4 - Tasa: 0.787946986746687
## Epoca: 5 - Tasa: 0.78944736184046
## Pesos: 221.050000000016
## Pesos: -217.553555499999
## Pesos: 7.66553299999999
## Pesos: -7.06385049999999
## Tasa de aciertos en test: 0.805194805194805
print(glue::glue("Tasa de aciertos media en test: {tasaMedia/10}"))
## Tasa de aciertos media en test: 0.788199718199718

– Datos con desviaciones del 50%

plot_ly(x=spheres2d50$X1, y=spheres2d50$X2, z=spheres2d50$X3, type="scatter3d", mode="markers", color=spheres2d50$X4)
tasaMedia <- 0
for (n in seq(1,10)) {
  print(glue::glue("Partición: {n}"))
  #Entrenamiento
  pesos <- entrenarPerceptron(spheres2d50[particion_spheres2d50$trn[[n]],], 
                                   maxEpocas = 5, critFinalizacion = 0.79)
  print(glue::glue("Pesos: {pesos}"))
  #Pruba
  test <- aplicarPerceptron(pesos, spheres2d50[particion_spheres2d50$tst[[n]],])
  print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
  tasaMedia <- tasaMedia + test$tasa
}
## Partición: 1
## Epoca: 1 - Tasa: 0.789
## Epoca: 2 - Tasa: 0.79
## Epoca: 3 - Tasa: 0.7905
## Pesos: 126.249999999995
## Pesos: -116.3539735
## Pesos: 10.7698595
## Pesos: -12.5806515
## Tasa de aciertos en test: 0.776
## Partición: 2
## Epoca: 1 - Tasa: 0.788302924268933
## Epoca: 2 - Tasa: 0.791802049487628
## Pesos: 85.3999999999973
## Pesos: -78.5787109999999
## Pesos: 7.09278050000001
## Pesos: -9.30471149999998
## Tasa de aciertos en test: 0.78978978978979
## Partición: 3
## Epoca: 1 - Tasa: 0.786196549137284
## Epoca: 2 - Tasa: 0.791197799449862
## Pesos: 85.8999999999973
## Pesos: -78.990983
## Pesos: 7.67113250000001
## Pesos: -9.54348099999999
## Tasa de aciertos en test: 0.792207792207792
## Partición: 4
## Epoca: 1 - Tasa: 0.782054486378405
## Epoca: 2 - Tasa: 0.785553611597101
## Epoca: 3 - Tasa: 0.787053236690827
## Epoca: 4 - Tasa: 0.787053236690827
## Epoca: 5 - Tasa: 0.787053236690827
## Pesos: 211.350000000014
## Pesos: -194.315286
## Pesos: 18.4535655
## Pesos: -21.3377595
## Tasa de aciertos en test: 0.787787787787788
## Partición: 5
## Epoca: 1 - Tasa: 0.784696174043511
## Epoca: 2 - Tasa: 0.787446861715429
## Epoca: 3 - Tasa: 0.787946986746687
## Epoca: 4 - Tasa: 0.787946986746687
## Epoca: 5 - Tasa: 0.787696924231058
## Pesos: 210.400000000014
## Pesos: -194.2384475
## Pesos: 17.2406485
## Pesos: -21.807366
## Tasa de aciertos en test: 0.804195804195804
## Partición: 6
## Epoca: 1 - Tasa: 0.78125
## Epoca: 2 - Tasa: 0.783
## Epoca: 3 - Tasa: 0.78425
## Epoca: 4 - Tasa: 0.7855
## Epoca: 5 - Tasa: 0.786
## Pesos: 213.450000000014
## Pesos: -197.2598605
## Pesos: 18.381788
## Pesos: -20.977634
## Tasa de aciertos en test: 0.801
## Partición: 7
## Epoca: 1 - Tasa: 0.785803549112722
## Epoca: 2 - Tasa: 0.789052736815796
## Epoca: 3 - Tasa: 0.790302424393902
## Pesos: 128.249999999995
## Pesos: -118.031558
## Pesos: 10.9605245
## Pesos: -13.55215
## Tasa de aciertos en test: 0.791791791791792
## Partición: 8
## Epoca: 1 - Tasa: 0.788447111777944
## Epoca: 2 - Tasa: 0.790947736934234
## Pesos: 85.6999999999973
## Pesos: -78.7525794999999
## Pesos: 7.2218615
## Pesos: -9.51060149999999
## Tasa de aciertos en test: 0.79020979020979
## Partición: 9
## Epoca: 1 - Tasa: 0.787803049237691
## Epoca: 2 - Tasa: 0.789052736815796
## Epoca: 3 - Tasa: 0.789802549362659
## Epoca: 4 - Tasa: 0.790802299425144
## Pesos: 165.450000000003
## Pesos: -152.465952
## Pesos: 14.287108
## Pesos: -16.9160525
## Tasa de aciertos en test: 0.783783783783784
## Partición: 10
## Epoca: 1 - Tasa: 0.788197049262316
## Epoca: 2 - Tasa: 0.79169792448112
## Pesos: 86.4499999999972
## Pesos: -79.5191819999999
## Pesos: 7.06969350000001
## Pesos: -9.36168599999997
## Tasa de aciertos en test: 0.79020979020979
print(glue::glue("Tasa de aciertos media en test: {tasaMedia/10}"))
## Tasa de aciertos media en test: 0.790697632997633

– Datos con desviaciones del 70%

plot_ly(x=spheres2d70$X1, y=spheres2d70$X2, z=spheres2d70$X3, type="scatter3d", mode="markers", color=spheres2d70$X4)
tasaMedia <- 0
for (n in seq(1,10)) {
  print(glue::glue("Partición: {n}"))
  #Entrenamiento
  pesos <- entrenarPerceptron(spheres2d70[particion_spheres2d70$trn[[n]],], 
                                   maxEpocas = 10, critFinalizacion = 0.77)
  print(glue::glue("Pesos: {pesos}"))
  #Pruba
  test <- aplicarPerceptron(pesos, spheres2d70[particion_spheres2d70$tst[[n]],])
  print(glue::glue("Tasa de aciertos en test: {test$tasa}"))
  tasaMedia <- tasaMedia + test$tasa
}
## Partición: 1
## Epoca: 1 - Tasa: 0.77075
## Pesos: 46.8999999999995
## Pesos: -41.3578315
## Pesos: 4.877081
## Pesos: -6.87418050000001
## Tasa de aciertos en test: 0.774
## Partición: 2
## Epoca: 1 - Tasa: 0.773556610847288
## Pesos: 47.1999999999995
## Pesos: -41.6143880000001
## Pesos: 5.1557375
## Pesos: -6.7593325
## Tasa de aciertos en test: 0.764764764764765
## Partición: 3
## Epoca: 1 - Tasa: 0.773943485871468
## Pesos: 46.9499999999995
## Pesos: -41.5467160000001
## Pesos: 4.486325
## Pesos: -7.0751025
## Tasa de aciertos en test: 0.767232767232767
## Partición: 4
## Epoca: 1 - Tasa: 0.770307423144214
## Pesos: 47.7999999999994
## Pesos: -42.3050485
## Pesos: 4.909167
## Pesos: -7.210052
## Tasa de aciertos en test: 0.786786786786787
## Partición: 5
## Epoca: 1 - Tasa: 0.775443860965241
## Pesos: 46.7999999999995
## Pesos: -41.237675
## Pesos: 4.8206895
## Pesos: -7.073508
## Tasa de aciertos en test: 0.766233766233766
## Partición: 6
## Epoca: 1 - Tasa: 0.7725
## Pesos: 47.1499999999995
## Pesos: -41.809585
## Pesos: 4.636054
## Pesos: -6.9702425
## Tasa de aciertos en test: 0.773
## Partición: 7
## Epoca: 1 - Tasa: 0.773056735816046
## Pesos: 47.6999999999994
## Pesos: -41.9619245000001
## Pesos: 5.10788299999999
## Pesos: -7.0768385
## Tasa de aciertos en test: 0.764764764764765
## Partición: 8
## Epoca: 1 - Tasa: 0.765441360340085
## Epoca: 2 - Tasa: 0.765191297824456
## Epoca: 3 - Tasa: 0.764941235308827
## Epoca: 4 - Tasa: 0.764691172793198
## Epoca: 5 - Tasa: 0.764441110277569
## Epoca: 6 - Tasa: 0.764941235308827
## Epoca: 7 - Tasa: 0.764941235308827
## Epoca: 8 - Tasa: 0.764691172793198
## Epoca: 9 - Tasa: 0.764441110277569
## Epoca: 10 - Tasa: 0.764691172793198
## Pesos: 445.700000000067
## Pesos: -395.948906000001
## Pesos: 51.5011865000001
## Pesos: -57.9248295
## Tasa de aciertos en test: 0.791208791208791
## Partición: 9
## Epoca: 1 - Tasa: 0.7808047988003
## Pesos: 46.3499999999995
## Pesos: -40.8424720000001
## Pesos: 4.59528749999999
## Pesos: -7.4213425
## Tasa de aciertos en test: 0.757757757757758
## Partición: 10
## Epoca: 1 - Tasa: 0.773693423355839
## Pesos: 47.3999999999994
## Pesos: -42.0085840000001
## Pesos: 4.77458199999999
## Pesos: -7.1187695
## Tasa de aciertos en test: 0.774225774225774
print(glue::glue("Tasa de aciertos media en test: {tasaMedia/10}"))
## Tasa de aciertos media en test: 0.771997517297517

Preguntas:

  • ¿Qué beneficio supone el uso de validación cruzada?

El uso de validación cruzada nos permite usar todos los datos para test y poder evaluar de mejor manera si el método utilizado para la generación del modelo es bueno.

  • ¿Qué ocurre con la tasa de acierto del perceptrón para los diferentes datasets del ejercicio 2b? Analice el desempeño al incrementarse la dispersión de los datos.

Al aumentar la dispersión de los datos, disminuye la tasa de aciertos porque el plano no permite separar correctamente las clases.

Ejercicio 3

El algoritmo implementado se encuentra en el archivo “PerceptronMulticapa.R”

concentlite <- read_csv("../PUBLICO/Encuentro 1/Práctica/data/concentlite.csv", col_names = FALSE)
ggplot(data=concentlite, aes(x=X1, y=X2,color=X3))+geom_point()

resultado <- entrenarPerceptronM(concentlite, maxEpocas = 500, critFinalizacion = 0.9, nu=0.1,
                                 arquitectura = c(4,1))
## ##------ Tue Nov 12 19:39:27 2019 ------##
## [1] 0.9184853
## [1] 0.9183602
## [1] 0.9182631
## [1] 0.9181799
## [1] 0.9181052
## [1] 0.9180369
## [1] 0.9179742
## [1] 0.9179169
## [1] 0.9178648
## [1] 0.9178177
## [1] 0.9177753
## [1] 0.9177374
## [1] 0.9177035
## [1] 0.9176733
## [1] 0.9176465
## [1] 0.9176226
## [1] 0.9176014
## [1] 0.9175825
## [1] 0.9175658
## [1] 0.9175511
## [1] 0.917538
## [1] 0.9175266
## [1] 0.9175165
## [1] 0.9175078
## [1] 0.9175002
## [1] 0.9174937
## [1] 0.9174881
## [1] 0.9174834
## [1] 0.9174795
## [1] 0.9174764
## [1] 0.9174738
## [1] 0.9174719
## [1] 0.9174705
## [1] 0.9174696
## [1] 0.9174692
## [1] 0.9174691
## [1] 0.9174694
## [1] 0.91747
## [1] 0.9174709
## [1] 0.9174721
## [1] 0.9174735
## [1] 0.917475
## [1] 0.9174768
## [1] 0.9174787
## [1] 0.9174807
## [1] 0.9174828
## [1] 0.917485
## [1] 0.9174872
## [1] 0.9174894
## [1] 0.9174917
## [1] 0.9174939
## [1] 0.9174961
## [1] 0.9174983
## [1] 0.9175003
## [1] 0.9175023
## [1] 0.9175041
## [1] 0.9175058
## [1] 0.9175073
## [1] 0.9175085
## [1] 0.9175095
## [1] 0.9175103
## [1] 0.9175107
## [1] 0.9175108
## [1] 0.9175104
## [1] 0.9175096
## [1] 0.9175083
## [1] 0.9175064
## [1] 0.9175039
## [1] 0.9175007
## [1] 0.9174966
## [1] 0.9174917
## [1] 0.9174857
## [1] 0.9174785
## [1] 0.91747
## [1] 0.91746
## [1] 0.9174483
## [1] 0.9174346
## [1] 0.9174187
## [1] 0.9174003
## [1] 0.9173788
## [1] 0.917354
## [1] 0.9173252
## [1] 0.9172917
## [1] 0.9172528
## [1] 0.9172075
## [1] 0.9171547
## [1] 0.917093
## [1] 0.9170206
## [1] 0.9169354
## [1] 0.9168347
## [1] 0.9167153
## [1] 0.916573
## [1] 0.9164025
## [1] 0.9161971
## [1] 0.915948
## [1] 0.9156438
## [1] 0.9152698
## [1] 0.9148059
## [1] 0.9142256
## [1] 0.9134925
## [1] 0.9125563
## [1] 0.9113458
## [1] 0.9097584
## [1] 0.9076425
## [1] 0.9047689
## [1] 0.9007873
## [1] 0.8951668
## [1] 0.8871347
## [1] 0.8756657
## [1] 0.8596319
## [1] 0.8382931
## [1] 0.812233
## [1] 0.7841945
## [1] 0.7583998
## [1] 0.7381327
## [1] 0.724091
## [1] 0.7150658
## [1] 0.7094027
## [1] 0.7057877
## [1] 0.7033727
## [1] 0.7016579
## [1] 0.7003612
## [1] 0.6993271
## [1] 0.6984716
## [1] 0.6977481
## [1] 0.6971267
## [1] 0.6965814
## [1] 0.696084
## [1] 0.6955998
## [1] 0.6950834
## [1] 0.69447
## [1] 0.6936574
## [1] 0.6924693
## [1] 0.6905761
## [1] 0.687325
## [1] 0.6813779
## [1] 0.6700009
## [1] 0.6478958
## [1] 0.6058186
## [1] 0.5324492
## [1] 0.4371175
## [1] 0.3527346
## ##------ Tue Nov 12 19:46:32 2019 ------##
concentlite <- cbind(concentlite,resultado$resultado)
ggplot(data=concentlite, aes(x=X1, y=X2, color=X3, shape=as.factor(resultado$resultado)))+geom_point()

plot(resultado$error)

resultado$tasa
## [1] 0.9063625